<?php

namespace App\Process;

use App\Utility\Cache;
use EasySwoole\Component\Process\AbstractProcess;

class FormId extends AbstractProcess{
    private $isRun = false;
    public function run($arg){
        //定时500ms检测有没有任务，有的话就while死循环执行
        $this->addTick(500,function (){
            if(!$this->isRun){
                $this->isRun = true;
                go(function (){
                    while (true){
                        try{
                            $queue = new Cache();
                            $task = $queue->onQueue('formid')->read();
                            if($task){
                                //根据openid取找到相应的openid的formid的集合，先删除该集合已过期的所有的formid,
                                $queue->zRemRangeByScore($task['openid'],0,time()+10);
                                //如果删除集合中过期的formid值后该集合为空，则删除对应的小程序的openid集合中的openid元素
                                if($queue->zCard($task['openid']) == 0) $queue->srem($task['name'],$task['name'].'*'.$task['openid']);
                                //判断用户是否订阅消息
                                $userModelName = 'App\Model\Users'.ucfirst($task['name']).'Model';
                                $userModel = new $userModelName;
                                $user = $userModel->where('openid',$task['openid'])->first();
                                if(isset($user['status'])){
                                    if($user['status'] == 1){
                                        //不同的openid生成不同的formid集合，并记录有效时间
                                        $queue->zAdd($task['openid'],$task['expire'],$task['formid']);
                                        //不同的小程序生成不同的openid集合
                                        $queue->sAdd($task['name'],$task['name'].'*'.$task['openid']);
                                        //记录数据库用作备份资料
//                                        $_model = 'App\Model\Formids'.ucfirst($task['name']).'Model';
//                                        $model  = new $_model;
//                                        $insert = [
//                                            'openid' => $task['openid'],
//                                            'expires_at' => $task['expire'],
//                                            'formid' => $task['formid'],
//                                        ];
//                                        $model->create($insert);
//                                        unset($model);
                                    }else{
                                        //清空formid集合和删除该小程序openid集合中的值
                                        $queue->delete($task['openid']);
                                        $queue->srem($task['name'],$task['name'].'*'.$task['openid']);
                                    }
                                }else{
                                    //不同的openid生成不同的formid集合，并记录有效时间
                                    $queue->zAdd($task['openid'],$task['expire'],$task['formid']);
                                    //不同的小程序生成不同的openid集合
                                    $queue->sAdd($task['name'],$task['name'].'*'.$task['openid']);
                                    //记录数据库用作备份资料
//                                    $_model = 'App\Model\Formids'.ucfirst($task['name']).'Model';
//                                    $model  = new $_model;
//                                    $insert = [
//                                        'openid' => $task['openid'],
//                                        'expires_at' => $task['expire'],
//                                        'formid' => $task['formid'],
//                                    ];
//                                    $model->create($insert);
//                                    unset($model);
                                }
                                unset($userModel);
                            }else{
                                break;
                            }
                            unset($queue);
                        }catch (\Throwable $throwable){
                            break;
                        }
                    }
                    $this->isRun = false;
                });
            }
        });
    }

    public function onShutDown()
    {
        // TODO: Implement onShutDown() method.
    }

    public function onReceive(string $str, ...$args)
    {
        // TODO: Implement onReceive() method.
    }
}
